# 元类的定义：元类就是创建类的类

# 定义一个元类方法，声明的Person类指定元类方法为 UpperMetaClass，
# 将Person类的非私有属性（不是__开头的方法） 名称全部替换成大写的
def UpperMetaClass(class_name, class_parents, class_attrs):
    print(class_attrs)
    new_attrs = {}
    for name, value in class_attrs.items():
        if not name.startswith('__'):
            new_attrs[name.upper()] = value
        else:
            new_attrs[name] = value
    return type(class_name, class_parents, new_attrs)


class Person(object, metaclass=UpperMetaClass):
    name = '张三'
    __age = 20


if __name__ == '__main__':

    p1 = Person()
    print(p1.__class__) # <class '__main__.Person'>

    # print(p1.name) # 神奇：p1.name 报错了
    print(p1.NAME) # 神奇：p1.NAME 可以打印出属性的值
    print(Person.__class__) # <class 'type'>
    print(hasattr(Person, 'name')) # False
    print(hasattr(Person, 'NAME')) # True